home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / f2c / may_5_92.lha / f2c.VMay_5_1992 / libI77 / backspace.c next >
C/C++ Source or Header  |  1992-05-07  |  1KB  |  64 lines

  1. #include "f2c.h"
  2. #include "fio.h"
  3. integer f_back(a) alist *a;
  4. {    unit *b;
  5.     int n,i;
  6.     long x;
  7.     char buf[32];
  8.     if(a->aunit >= MXUNIT || a->aunit < 0)
  9.         err(a->aerr,101,"backspace")
  10.     b= &units[a->aunit];
  11.     if(b->useek==0) err(a->aerr,106,"backspace")
  12.     if(b->ufd==NULL) {
  13.         fk_open(1, 1, a->aunit);
  14.         return(0);
  15.         }
  16.     if(b->uend==1)
  17.     {    b->uend=0;
  18.         return(0);
  19.     }
  20.     if(b->uwrt) {
  21.         (void) t_runc(a);
  22.         if (nowreading(b))
  23.             err(a->aerr,errno,"backspace")
  24.         }
  25.     if(b->url>0)
  26.     {    long y;
  27.         x=ftell(b->ufd);
  28.         y = x % b->url;
  29.         if(y == 0) x--;
  30.         x /= b->url;
  31.         x *= b->url;
  32.         (void) fseek(b->ufd,x,SEEK_SET);
  33.         return(0);
  34.     }
  35.  
  36.     if(b->ufmt==0)
  37.     {    (void) fseek(b->ufd,-(long)sizeof(int),SEEK_CUR);
  38.         (void) fread((char *)&n,sizeof(int),1,b->ufd);
  39.         (void) fseek(b->ufd,-(long)n-2*sizeof(int),SEEK_CUR);
  40.         return(0);
  41.     }
  42.     for(;;)
  43.     {    long y;
  44.         y = x=ftell(b->ufd);
  45.         if(x<sizeof(buf)) x=0;
  46.         else x -= sizeof(buf);
  47.         (void) fseek(b->ufd,x,SEEK_SET);
  48.         n=fread(buf,1,(int)(y-x), b->ufd);
  49.         for(i=n-2;i>=0;i--)
  50.         {
  51.             if(buf[i]!='\n') continue;
  52.             (void) fseek(b->ufd,(long)(i+1-n),SEEK_CUR);
  53.             return(0);
  54.         }
  55.         if(x==0)
  56.             {
  57.             (void) fseek(b->ufd, 0L, SEEK_SET);
  58.             return(0);
  59.             }
  60.         else if(n<=0) err(a->aerr,(EOF),"backspace")
  61.         (void) fseek(b->ufd, x, SEEK_SET);
  62.     }
  63. }
  64.